public class Integer_Partation {
    public static void main(String[] args) {
        int result = integer_partation(4,4);
        System.out.println(result);
    }
    public static int integer_partation(int n, int m) {
        /*
        设置两个参数，n表示要拆分的整数，m表示该次拆分可拆的最大加数
        例如（5，3）意味着最大可拆为5 = 3 + 2；而不能是5 = 4 + 1；

        1、当 n = 1或者 m = 1，意味着n不用拆或者只能拆为1 + 1 +...
            结束返回 只有1种情况
        2、当 n < m 此时可拆的最大加数m大于n，在n > m 分支的第二个式子可能出现
            结束返回f(n ,n),将加数大于n转化为加数等于n参与运算
        3、当 n = m 此时最大加数和要拆分数相同，可将该拆数拆为自身
            结束返回f(n,n-1) + 拆分为自身的那种情况
        4、当 n > m 两条路径，一条是拆分的最大加数减一，进入下层递归（一直到加数为一停止）
            另一种是拆分出一个m，此时要拆分的整数还剩下n - m，最大加数还是m，进入下层递归
            结束返回f(n,m-1) + f(n-m,m)
         */
        if(n == 1 || m == 1)
            return 1;
        if(n<m)
            return integer_partation(n, n);
        if(n == m)
            return integer_partation(n, n-1) + 1;
        if(n > m)
            return integer_partation(n, m - 1) + integer_partation(n - m, m);
        return 1; //这个是代码完善性的考虑，并无实际意义
    }
}
